"""
@作者 = "陈诗"
@email = 3168157154@qq.com
@creative_time = 2025/11/5 19:27
"""
import random as rd
import time


# 基础装饰器
def log_func(func_):
    def print_func(*args, **kwargs):  # 支持被装饰函数带参数 以及多个实参
        # print(func_.__name__)  # 调入函数名
        func_name = func_.__name__  # 避免重复的名字查找,直接保存一个来使用
        print(f"函数 {func_name} 开始执行")
        result = func_(*args, **kwargs)  # 调用函数func_
        print(f"函数 {func_name} 执行完毕")
        return result
    return print_func


# 测试
@log_func
def hello():
    print("hello!!")


@log_func
def greet(name, msg="hi"):
    print(f"{msg},{name}!")


hello()
print('------')
greet("zz")  # 使用默认msg'hi'
print('------')
greet("aa", 'nihao')  # 主动输入,不用默认的


# 带参数装饰器
def retry(max_attempts):  # 最大重试次数
    def try_func(func):  # 被装饰函数,真正被调用的函数
        def repeat():  # 执行
            for i in range(1, max_attempts + 1):  # [1, max_attempts]
                print(f"重试第{i}次")
                try:
                    func()  # risky_func()  检定,0.3概率成功,并执行下一行
                    print(f"在第{i}次重试后,成功运行!")
                    break
                except RuntimeError as r:  # 即在risk_func中抛出的异常类型
                    if i == max_attempts:  # 跳到except里了,最后一次已经尝试失败
                        print("次数耗尽,抛出异常!")
                        raise r
                    else:
                        print(f"在第{i}次重试中,结果为失败,正在进行第{i+1}次重试中...")
                        continue
        return repeat
    return try_func


@retry(max_attempts=5)  # 自行定义最大次数
def risky_func():
    if rd.random() < 0.7:  # 随机数在0到1内,故70%概率执行
        raise RuntimeError("执行失败")  # 主动抛出异常,并在显示的异常前 输出语句


risky_func()
